package com.nuoniu.sibanyun.service.erp.in;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nuoniu.sibanyun.entity.bo.UnExecutedBo;
import com.nuoniu.sibanyun.entity.dto.InInventoryPageSearchDto;
import com.nuoniu.sibanyun.entity.dto.InInventorySaveDto;
import com.nuoniu.sibanyun.entity.dto.InInventorySearchDto;
import com.nuoniu.sibanyun.entity.erp.in.InInventory;
import com.nuoniu.sibanyun.entity.erp.in.InInventoryClass;
import com.nuoniu.sibanyun.entity.erp.in.InInventoryLocation;
import com.nuoniu.sibanyun.entity.erp.in.InWarehouse;
import com.nuoniu.sibanyun.entity.vo.InInventoryPropertyVo;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;

/**
 * <p>
 * 物料档案 服务类
 * </p>
 *
 * @author baiqiang
 * @since 2020-09-22
 */
public interface IInInventoryService extends IService<InInventory> {

    /**
     * 保存 物料档案
     * @param inInventorySaveDto
     */
    Long saveInInventory(InInventorySaveDto inInventorySaveDto);

    /**
     * 获取档案列表
     * @author 小啊刚
     * @date 2020-09-25
     */
    List<InInventory> getByClass(Integer id);

    /**
     * 分页获取列表
     * @author 小啊刚
     * @date 2020-09-25
     */
    Page<InInventory> pageList(Page page, InInventoryPageSearchDto inInventoryPageSearchDto);

    /**
     * 修改仓库
     * @author 小啊刚
     * @date 2020-09-26
     */
    void updateWarehouse(InWarehouse inWarehouse);

    /**
     * 查重
     * @author 小啊刚
     * @date 2020-09-28
     */
    InInventory getByCode(InInventory inInventory);

    /**
     * 根据名称获取仓库
     * @author 小啊刚
     * @date 2020-09-30
     */
    InInventory getByName(InInventory inInventory);

    /**
     * 根据计量单位获取物料
     * @author 小啊刚
     * @date 2020-11-24
     */
    List<InInventory> getByUnitId(Integer id);

    /**
     * 根据计量单位组获取物料
     * @author 小啊刚
     * @date 2020-11-24
     */
    List<InInventory> getByUnitGroupId(Integer unitGroupId);

    /**
     * 条件搜索获取存
     * @author 小啊刚
     * @date 2020-11-28
     */
    Page<InInventory> getList(Page page, InInventorySearchDto inInventorySearchDto);

    Integer getByUnit(Long id);

    /**
     * 异步修改单据物料信息
     * @author 小啊刚
     * @date 2021-01-25
     */
    void updateBillInventory(InInventory inInventory);

    /**
     * 秕量删除物料
     * @author 小啊刚
     * @date 2021-01-25
     */
    void deleteByIds(List<Integer> ids);

    /**
     * 根据仓库获取
     * @author 小啊刚
     * @date 2021-01-26
     */
    List<InInventory> getByWarehouse(String join);

    /**
     * 获取某些物料未执行的数量
     * @param mainTableName
     * @param detailTableName
     * @param inventoryIds
     * @return
     */
    List<UnExecutedBo> getUnExecuteQuantity(String mainTableName, String detailTableName, String inventoryIds,String warehouseIds);

    /**
     * 获取某些物料的 可用量
     * @param inventoryIdSet
     * @return
     */
    HashMap<Integer,BigDecimal> getAvailableQuantityMap(Set<Integer> inventoryIdSet,Set<Integer> warehouseIdSet);

    /**
     * 获取 物料 数量情况（可用量、现存量）
     * @param inventoryIdList
     * @return
     */
    HashMap<Integer,HashMap<String,BigDecimal>> getInventoryQuantity(Set<Integer> inventoryIdList);

    /**
     * 修改物料名称
     * @author 小啊刚
     * @date 2021-04-03
     */
    void updateInventoryClass(InInventoryClass inInventoryClass);

    /**
     * 下载导入模版
     * @author 小啊刚
     * @date 2021-06-17
     */
    void importTemplate(HttpServletResponse response);

    /**
     * 导入数据
     * @author 小啊刚
     * @date 2021-06-17
     */
    Map importData(MultipartFile file, boolean b, String[] excelFiled, String[] dbFiled, Integer classId) throws IOException;

    /**
     * 获取存货导入字段
     * @author 小啊刚
     * @date 2021-06-17
     */
    List<Map<String, String>> getInventoryImportFiled();

    /**
     * 导出物料档案
     * @author 小啊刚
     * @date 2021-06-19
     */
    void exportData(Integer classId, HttpServletResponse response);

    /**
     * 修改单价
     * @author 小啊刚
     * @date 2021-06-23
     */
    void updatePrice(InInventory inventory);

    /**
     * 获取物料档案属性
     * @param id
     * @return
     */
    InInventoryPropertyVo getInInventoryPropertyVo(Integer id);

    /**
     * 获取商品属性
     * @param id
     * @return
     */
    String getCommodityAttribute(Long id);

    /**
     * 获取物料档案 库存控制属性
     * @param ids
     * @return
     */
    List<InInventory> listInInventoryControlProperty(Collection<Integer> ids);

    void dAllOrder();
}
